#include <bits/stdc++.h>

using namespace std;


using LL=long long;
const int MOD=1e9+7;
class Solution {
public:
    vector<vector<int>> combined_ret;
    LL C[131][131];
    LL A[131];
    int n,k;
    Solution(){
        for(int i=0;i<131;i++){
            C[i][0]=1;
        }
        for(int i=1;i<131;i++){
            C[i][i]=1;
        }
        for(int i=2;i<131;i++){
            for(int j=1;j<i;j++){
                C[i][j]=((C[i-1][j-1])%MOD+(C[i-1][j])%MOD)%MOD;
            }
        }
        A[0]=1;
        for(int i=1;i<131;i++){
            A[i]=(i*A[i-1])%MOD;
        }
    }

    //深搜组合数
    /**
     * idx 当前的组合的长度，控制搜索的长度不超过26个字母
     * cur_n 当前分配过后剩余为分配的n的次数
     * pre  当前的分配矩阵
     * pre_min 前一次搜索到的最后一位
     */ 
    void helper(int idx,int cur_n,vector<int> &pre,int pre_min){
        if(cur_n==0){
            combined_ret.push_back(pre);
            return;
        }else if(idx==26){
            return;
        }else{
            for(int i=pre_min;i<min(this->k+1,cur_n+1);i++){
                pre.push_back(i);
                helper(idx+1,cur_n-i,pre,i);
                pre.pop_back();
            }
        }
    }
    int pow_mod(LL x,LL n){
        if(x==0) return 0;
        if(x==1||n==0) return 1;
        LL ans=1,xx=x;
        while(n){
            if(n&1) ans=(ans*xx)%MOD;
            xx=(xx*xx)%MOD;
            n=(n>>1);
        }
        return ans%MOD;
    }
    int exgcd(LL a,LL b,LL &x,LL &y){
        if(b==0){
            x=1,y=0;
            return a;
        }
        int ret=exgcd(b,a%b,x,y);
        LL t=x;
        x=y;
        y=t-((a/b)*y); //这里有除法。。不能取模
        return ret;
    }

    int keyboard(int k, int n) {
        // cout << "k: "<< k << " n: "<< n <<endl;
        this->k=k;
        this->n=n;
        combined_ret.clear();
        //将n拆分为项不大于k的拆分数
        vector<int> v;
        helper(0,n,v,1);

        int cnt=combined_ret.size();
        //将每一个vector统计同一次数的个数
        unordered_map<int,int> mp[cnt+1];
        for(int i=0;i<cnt;i++){
            mp[i].clear();
            for(int j=0;j<(int)combined_ret[i].size();j++){
                // cout << combined_ret[i][j] << " ";
                mp[i][combined_ret[i][j]]++;
            }
        }

        int ans=0;
        for(int i=0;i<cnt;i++){
            LL x=1,y=1,llen=26;
            for(auto it=mp[i].begin();it!=mp[i].end();it++){
                // cout << it->first << ":" << it->second << " "<<endl;
                x=(x*C[llen][it->second])%MOD;
                llen -= it->second;
                y=(y*(pow_mod(A[it->first],it->second))%MOD);
            }
            LL nx;
            nx=pow_mod(y,MOD-2);
            // LL nx,ny;
            // exgcd(y,MOD,nx,ny);

            // cout << nx<<endl;
            ans=(ans+(((x*A[n])%MOD)*nx)%MOD)%MOD;
        }       
        return ans%MOD;
    }
};

/*
dp[i][j]表示 总共按了i次键盘，共使用了j个字母所有可能的组合数
转移方程为: dp[i][j]={x=1...k}dp[i-x][j-1]*C(i,x)
*/
using LL=long long;
class Solution1 {
    LL MOD=1e9+7;
    LL C[131][131];
public:
    Solution1(){
        for(int i=0;i<131;i++){
            C[i][i]=1;
            C[i][0]=1;
        }
        for(int i=2;i<131;i++){
            for(int j=1;j<i;j++){
                C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;
            }
        }
    }
    int keyboard(int k, int n) {
        LL dp[131][27]={0};
        for(int i=0;i<26;i++){
            dp[0][i]=1;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=26;j++){
                for(int x=0;x<=k;x++){
                    if(i-x<0)continue;
                    dp[i][j]=(dp[i][j]+(dp[i-x][j-1]*C[i][x])%MOD)%MOD;
                }
            }
        }
        return dp[n][26];
    }
};

int main(){
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    Solution1 s;
    int n,k;
    while(cin >> k >> n){
        int ans=s.keyboard(k,n);
        cout << "ans= "<<ans <<endl;
    }
    
   
    // LL x,y;
    // s.exgcd(2,MOD,x,y);
    // cout << "x: "<<x << " y: " << y<<endl;


    return 0;
}